ট্রানজ্যাকশন ম্যানেজমেন্ট (Transaction Management) হলো এমন একটি প্রক্রিয়া যা ডাটাবেস অপারেশনগুলোকে একটি একক ইউনিট হিসেবে পরিচালনা করে। এটি নিশ্চিত করে যে, একটি নির্দিষ্ট গুচ্ছ অপারেশন সম্পূর্ণ (commit) হবে অথবা সম্পূর্ণ বাতিল (rollback) হবে।
স্প্রিং বুটে ট্রানজ্যাকশন ম্যানেজমেন্ট খুব সহজে ব্যবহার করা যায়, কারণ এটি JPA এবং Hibernate এর ওপর ভিত্তি করে স্বয়ংক্রিয়ভাবে কাজ করে। স্প্রিং-এর @Transactional অ্যানোটেশন ব্যবহার করে এটি কনফিগার করা যায়।
স্প্রিং বুটে ট্রানজ্যাকশন ম্যানেজমেন্টের মূল বৈশিষ্ট্য
- অটোমেটেড রোলব্যাক: ব্যর্থতার সময় ডেটা অটোমেটিক্যালি পূর্বের অবস্থায় ফিরে যায়।
- ACID প্রপার্টি মেইনটেইন করা: এটি নিশ্চিত করে যে ট্রানজ্যাকশনগুলি Atomicity, Consistency, Isolation, এবং Durability মেনে চলে।
- ডেটা ইনটিগ্রিটি: একাধিক ডেটাবেস অপারেশন একটি লজিক্যাল ইউনিটে একত্রিত করা হয়।
@Transactional অ্যানোটেশনের ব্যবহার
স্প্রিং বুটে @Transactional অ্যানোটেশন ব্যবহার করে সহজেই ট্রানজ্যাকশন পরিচালনা করা যায়। এই অ্যানোটেশনটি Service লেয়ারে সাধারণত ব্যবহার করা হয়।
উদাহরণ: একটি Employee Management সিস্টেম
Entity ক্লাস
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String department;
// Getter এবং Setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
Repository ইন্টারফেস
import org.springframework.data.jpa.repository.JpaRepository;
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}
Service ক্লাস: ট্রানজ্যাকশন ম্যানেজমেন্ট
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class EmployeeService {
private final EmployeeRepository employeeRepository;
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
@Transactional
public void saveEmployeeData(Employee employee1, Employee employee2) {
// প্রথম এমপ্লয়ি সেভ করা
employeeRepository.save(employee1);
// ইচ্ছাকৃতভাবে একটি এক্সেপশন থ্রো করা
if (employee2.getName() == null) {
throw new RuntimeException("Employee name cannot be null");
}
// দ্বিতীয় এমপ্লয়ি সেভ করা
employeeRepository.save(employee2);
}
}
Controller ক্লাস
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@PostMapping("/save")
public String saveEmployees(@RequestBody Employee employee1, @RequestBody Employee employee2) {
try {
employeeService.saveEmployeeData(employee1, employee2);
return "Employees saved successfully!";
} catch (RuntimeException e) {
return "Error: " + e.getMessage();
}
}
}
ব্যাখ্যা
@Transactional:saveEmployeeDataমেথডে@Transactionalব্যবহার করা হয়েছে। এর ফলে যদিemployee2সেভ করার সময় কোনো ব্যতিক্রম ঘটে, তাহলেemployee1এর সেভ অপারেশন রোলব্যাক হয়ে যাবে।
- Error Handling:
RuntimeExceptionবা অন্য কোনো ব্যতিক্রম ঘটলে ট্রানজ্যাকশন বাতিল (rollback) হবে এবং ডাটাবেসের পূর্ববর্তী অবস্থা বজায় থাকবে।
ট্রানজ্যাকশন প্রোপার্টি
@Transactional অ্যানোটেশন এর মধ্যে কিছু অতিরিক্ত প্রোপার্টি ব্যবহার করা যায়:
1. Propagation
ট্রানজ্যাকশন কীভাবে একটি নতুন বা বিদ্যমান ট্রানজ্যাকশনকে পরিচালনা করবে তা নির্ধারণ করে।
উদাহরণ:
@Transactional(propagation = Propagation.REQUIRED)
2. Isolation
ট্রানজ্যাকশনের আইসোলেশন লেভেল নির্ধারণ করে। উদাহরণ:
@Transactional(isolation = Isolation.READ_COMMITTED)
3. Rollback For
নির্দিষ্ট ব্যতিক্রমের জন্য রোলব্যাক কনফিগার করা যায়। উদাহরণ:
@Transactional(rollbackFor = RuntimeException.class)
সম্পূর্ণ উদাহরণ: Rollback এবং Commit
@Transactional(rollbackFor = Exception.class)
public void performTransaction() {
// Step 1: Save first entity
entityRepository.save(entity1);
// Step 2: Simulate an exception
if (true) {
throw new RuntimeException("Simulated Exception");
}
// Step 3: Save second entity
entityRepository.save(entity2);
}
উপরের কোডে, Step 1-এর অপারেশন রোলব্যাক হবে যদি Step 2-এ এক্সেপশন ঘটে।
সারাংশ
@Transactionalব্যবহার করে সহজেই ট্রানজ্যাকশন পরিচালনা করা যায়।- ব্যর্থ হলে পুরো ট্রানজ্যাকশন রোলব্যাক হয়, যা ডেটাবেসের ইন্টিগ্রিটি রক্ষা করে।
- Propagation এবং Isolation Level সঠিকভাবে ব্যবহার করে কার্যকারিতা বাড়ানো যায়।
- স্প্রিং বুট ORM ট্রানজ্যাকশন ম্যানেজমেন্টের মাধ্যমে ACID প্রোপার্টি নিশ্চিত করে।
Read more